package com.ming.learn.from.carl.hash;

import java.util.*;
import java.util.stream.Collectors;

/*
第349题. 两个数组的交集
 */
public class Of20201222LeetCode349 {
    public static void main(String[] args) {
        int[] result = intersection1(new int[]{4,9,5}, new int[]{9,4,9,8,4});
        for (int i : result) {
            System.out.print(i+"\t");
        }
    }
    /*
    给定两个数组，编写一个函数来计算它们的交集。
    「说明：」
    输出结果中的每个元素一定是唯一的。
    我们可以不考虑输出结果的顺序。
     */
    public static int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> resultSet = new HashSet<>();
        HashSet<Integer> numsSet = new HashSet<>();
        for (int i : nums1) {
            numsSet.add(i);
        }
        for (int i : nums2) {
            if (numsSet.contains(i)){
                resultSet.add(i);
            }
        }
        return resultSet.stream().mapToInt(i->i).toArray();
    }


    /*
    其他网友解法
     */
    public static int[] intersection1(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>(),set2 = new HashSet<>();
        for(int i:nums1){
            set1.add(i);
        }
        for(int i:nums2){
            set2.add(i);
        }
        set1.retainAll(set2);
        return set1.stream().mapToInt(i->i).toArray();
    }
    /*
    流式计算
     */
    public static int[] intersection2(int[] nums1, int[] nums2) {
        Set<Integer> set = Arrays.stream(nums1).boxed().collect(Collectors.toSet());
        return Arrays.stream(nums2).distinct().filter(set::contains).toArray();
    }
}
